#ifndef __CANprocess_H
#define __CANprocess_H

#include "gd32e10x.h"
#include "gd32e10x_can.h"
#define Max_cnt                  64
#define Max_can1          100
typedef	struct	CanRxStruct_Def
{
	can_receive_message_struct canMsg[Max_cnt];
	uint8_t savepos;
	uint8_t getpos;
}CanRxStruct_Typedef;

typedef	struct	Can1Rxconfig
{
	can_receive_message_struct canMsg[Max_can1];
	uint8_t savepos;
	uint8_t getpos;
	uint16_t CANConfigLen;
	uint8_t config_ser;
}Can1Rxconfig_Typedef;

typedef struct UpDataConfig
{
	uint32_t UpDaLen;
	
}UpDataConfig;
void CANProcess(void);
void can_filter_config(uint32_t CANx);
typedef struct Control_Tim
{
	u16  openDROld;
	u16  openDRNew;
	u8   Step_openDR;
	u8   Step_openDRcnt;
	u16  clseDROld;
	u16  closeDRNew;
	u8   Step_closeDR;
	u8   Step_closeDRcnt;
	u16  LightOld;
	u16  LightNew;
	u8   Step_Light;
	u8   Step_Lightcnt;
	u16  WhistleOld;
	u16  WhistleNew;
	u8   Step_Whistle;
	u8   Step_Whistlecnt;	
	u16  openWinOld;
	u16  openWinNew;
	u8   Step_openWin;
	u8   Step_openWincnt;
	u16  closeWinOld;
	u16  closeWinNew;
	u8   Step_closeWin;
	u8   Step_closeWincnt;
	u16  openskyWinOld;
	u16  openskyWinNew;
	u8   Step_openskyWin;
	u8   Step_openskyWincnt;
	u16  closeskyWinOld;
	u16  closeskyWinNew;
	u8   Step_closeskyWin;	
	u8   Step_closeskyWincnt;
	u16  powerupOld;
	u16  powerupNew;
	u8   Step_powerup;
	u8   Step_powerupcnt;
	u16  powerdownOld;
	u16  powerdownNew;
	u8   Step_powerdown;
	u8   Step_powerdowncnt;
	u16  IgOld;
	u16  IgNew;
	u8   Step_Ig;
	u16  chargeOld;
	u16  chargeNew;
	u8   Step_charge;
	u16  EngineOld;
	u16  EngineNew;
	u8   Step_Engine;
	u16  DoorOpenOld;
	u16  DoorOpenNew;
	u8	 Step_DoorOpen;
	u16  can0sta_Old;
	u16  can0sta_New;
	u8   can0sta_Step;
	u16  can1sta_Old;
	u16  can1sta_New;
	u8   can1sta_Step;
	
	u8 DTCget_Step;
	u16 DTCgetold;
	u16 DTCgetnew;
	u8 DTCclear_Step;
	u16 DTCclearold;
	u16 DTCclearnew;
	u8 INSP_Step;
	u16 INSP_old;
	u16 INSP_new;
	u8 readINSP_Step;
	u16 readINSP_old;
	u16 readINSP_new;
}Control_Tim;
typedef struct Control_Vehicle
{
	u8 Lock_Ctrl;
	u8 Light_Ctrl;       //0X84 关闭灯光电源、0x88 开通灯光电源
	u8 Whistle_Ctrl;
	u8 Window_Ctrl;
	u8 Power_Ctrl;
	u8 Engine_Ctrl;
	u8 Skylight_Ctrl;
	u8 DTC_Ctrl;             //BIT0=81 清除故障码、bit1 =82 读故障码
	u8 DTC_Read;			 //故障码读取状态、保养信息读取，0-数据无效，bit0 - 1故障码读取成功，bit1 - 1保养信息读取成功
	u8 RV_Power_Ctrl;		 //房车电源控制，1-启动，2-关闭，2-ADAS激活；当数据读取后进行清0；
}Control_Vehicle;

//保养设置，有新信息，newdatast=1，设置完清零
typedef struct Health_Set
{
	 u8  newdatast; 
	 u8	 Rtc_BCD[6]; 	//保养设置 - BCD码
	 u32 Health_Odo;	//保养里程 -大保养
	 u16 Health_Tim;   	//保养时间 -大保养
	 u32 Health_Odo_l;	//保养里程 -小保养
	 u16 Health_Tim_l;	//保养时间 -小保养
	 u8  Oillife_Per;  	//机油百分比 1
}Health_Set;

/********************以下是从STM32中cpy资源过来****************************/

typedef struct vehicle_state_updata
{
	u8  doors_status;            //车门状态
	u8  doorsRst;
	u8  lights_status;           //车外灯
	u8  lightRst;
	u8  autoLigtSt;              //车内灯 bit0:ill bit1:刹车灯 bit2:倒车灯 bit3:日间行车灯 bit4：右转补光灯 bit5:左转补光灯
	u8  BackLight;				 //仪表背光亮度 0-100
	u8  win_status;              //车窗
	u8  winRst;
	u8  lock;                    //车锁
	u8  lockRst;
	u8  brake_gear;              //档位
	u8  brake_gearRst;
	u8  Ignition_status;         //点火
	u8  IgnitionRst;
	u8  Charge_status;           //充电
	u8  ChargeRst;
	u8  other_status;            //其他
	u8  otherRst;//
	u32 Odo;                     //里程 KM
	u8  OdoRst;
	u16 Oil;                     //油量  L
	u8  OilRst;
	u16 Electricity;             //电量
	u8  ElectricityRst;
	u16 Endurance_mileage;       //续航 0.1km
	u8  Endurance_mileageRst;
	u16 speed;                   //车速  100m/h
	u8  speedRst;
	u16 engSpeed;                //发动机转速
	u8  engSpeedRst;
	u32 LPK;                     //瞬时油耗以及单位
	u8  LPKRst;
//	float carVoltage;
//	u8 carVoltageRst;
//	float carCurrent;
//	u8 carCurrentRst;
	u16 powerBatVolt;           //动力电池电流
	u8  powerBatVoltRst;
	u16 powerBatCurrent;        //动力电池电流   最高位1  负数     最高位0 正数
	u8  powerBatCurrentRst;
	u8	lf_TP;//左前轮胎压值
	u8	rf_TP;//右前轮胎压值
	u8	lr_TP;//左后轮胎压值
	u8	rr_TP;//右后轮胎压值
	u8	lf_T;//左前轮胎温度				
	u8	rf_T;//右前轮胎温度				
	u8	lr_T;//左后轮胎温度				
	u8	rr_T;//右后轮胎温度				
	u8	TPMSRst;//胎压标志是否有效		
//--------------------------------------	
	u8	CNGRst;//压力传感器是否有效		
	u8	CNGVolt;//增加CNG压力传感器的电压
	
	u8  GasAddRst;//充天然气是否完成
	u8	AddGas; //增加气体量
	
//--------------------------------------
	u8 DTC_Num;  //故障码总数
	u32 DTCLIST[15];  //通用故障列表 最多存10个
	u32 EMSDTdCLT[10];  //发动机故障列表 最多存10个
	u32 TCUDTCLT[10];  //发动机故障列表 最多存10个
	u32 BMSDTCLT[10];	//电池故障列表 最多存10个	
//--------------保养信息-----------------
	u32 Health_Odo;   //保养里程-大保养
	u16 Health_Tim;   //保养时间-大保养
	u32 Health_Odo_l; //保养里程-小保养
	u16 Health_Tim_l; //保养时间-小保养
	u8  Oillife_Per;  //机油百分比
//--------------以下为新增的保养后行驶的里程以及度过的天数
  	u32 Health_Odo_ed;   //行驶了保养里程-大保养
	u16 Health_Tim_ed;   //行驶了保养时间-大保养
	u32 Health_Odo_l_ed; //行驶了保养里程-小保养
	u16 Health_Tim_l_ed; //行驶了保养时间-小保养
	
	u16 Wheel_Deg;     //方向盘角度
	u8  Wheel_DegRst;
	u16 Wheel_Speed;     //方向盘转速
	u8   Wheel_SpeedRst;
	u16 AvgOilCsp;       //平均油耗
	u8  AvgOilCspRst;
	u8  SysFailtRst;
	u8  SysFailtStatus;//系统故障列表
	u8  CoolTemp;//	冷却液温度
	u32  AtmoPress;//大气压力
	u8  ThroPos ;//节气门位置
	u8  vehicleVIN[17];//车架号
	
	u32 AutoBATVol_u32;//电池电压
	#if CAN_debug
	u8 ChargeSta_db;
	#endif
}vehicle_state_updata;

/***************以下是桂林公交电池一传信息**************/
typedef struct GLBUS_bms
{
	u8 newdatast; 
	u8 monitor[3];  //绝缘监控仪前 3 字节
	u8 cell_soh;	//电池组SOh
	u8 bms2_1[8];	//电池组充电信息
	u8 bms4[8];	//动态信息
	u8 bms5[8];	
	u8 bms5_1[8];
	u8 bms5_2[8];
	u8 bms5_3[8];
	u8 bms5_4[8];
	u8 bms5_5;
	u8 bms6[4];
	u8 bms7[8];
}GLBUS_bmsg;

/********************************************************
 * @brief 增加赛呐威房车数据结构体
 * 
 *******************************************************/
typedef struct
{
	u8 project_id;			/*项目标识，每个项目不相同塞纳威定义为0x01，同时是数据刷新标识。当不等于0时上报一次数据*/

	u8 clear_water_st;		/*清水状态*/
	u8 gray_water_st;		/*灰水状态*/
	u8 black_water_st;		/*黑水状态*/
	u16 room_st;			/*大电瓶电压*/
	u16 total_voltage;		/*总电压*/
	u16 total_current;		/*总电流*/
	u16 surplus_capacity;	/*剩余容量*/
	u16 full_capacity;		/*充满容量*/
	u32 battery_state;		/*电池组均衡状态*/
	u16 protection_mark;	/*保护标识*/
}snwrv_data_msg_t;


typedef struct  tag_StateStr_Def
{
	u32	id;				//
	u8	dataoffset;		// 偏移位 data offset
	u8 	andvalue;	  	// 与计算字节
	u8  openvalue;  	// 操作值
	u8  closevalue; 	// 未操作值
}StateStr_TypeDef;

//偏移取字节
typedef struct vehicle_state_save
{
	const u32               can1Id[28];	
	const u32               can2Id[28];
	const StateStr_TypeDef	door_lf;	     //左前
	const StateStr_TypeDef	door_rf;         //右前
	const StateStr_TypeDef	door_lr;         //左后
	const StateStr_TypeDef	door_rr;	     //右后
	const StateStr_TypeDef	trunk;           //后备箱
	const StateStr_TypeDef  lamp_far;        //远光灯
	const StateStr_TypeDef  lamp_near;       //近光灯
	const StateStr_TypeDef  lamp_outline;    //示廓灯
	const StateStr_TypeDef  light_left;      //左闪
	const StateStr_TypeDef  light_right;     //右闪       
	const StateStr_TypeDef  light_double;    //双闪
	const StateStr_TypeDef  lock;            //中控锁
	const StateStr_TypeDef  lock_PKE;        //遥控锁，PKE锁，机械锁
	const StateStr_TypeDef  win_lf;          //左前窗
	const StateStr_TypeDef  win_rf;          //右前窗
	const StateStr_TypeDef  win_lr;          //左后窗
	const StateStr_TypeDef  win_rr;          //右后窗
	const StateStr_TypeDef  sunroof;         //天窗
	const StateStr_TypeDef  gear_P;            //档位P ASCII
	const StateStr_TypeDef  gear_R;            //档位R ASCII
	const StateStr_TypeDef  gear_N;            //档位N ASCII
	const StateStr_TypeDef  gear_D;            //档位D ASCII
	const StateStr_TypeDef  handbrake;       //手刹
	const StateStr_TypeDef  footbrake;       //脚刹
	const StateStr_TypeDef  saftty_belt;     //左前安全带
	const StateStr_TypeDef  air;             //空调
	const StateStr_TypeDef  engine;          //发动机转速
	const StateStr_TypeDef  ig_sign;         //点熄火状态
	const StateStr_TypeDef  speed;           //车速
	const StateStr_TypeDef  odo;             //里程
	const StateStr_TypeDef  oil;             //剩余油量,剩余电量
	const StateStr_TypeDef  battery_odo;     //油量续航里程
	const StateStr_TypeDef  charge_slow;     //慢充
	const StateStr_TypeDef  charge_fast;     //快充
	const StateStr_TypeDef	cover;           //前机舱盖
	const StateStr_TypeDef	Frontfog;        //前雾灯
	const StateStr_TypeDef	Rearfog;         //后雾灯
	const StateStr_TypeDef  Power;            //通断电状态
	const StateStr_TypeDef  LFlock;           //左前中控锁
	const StateStr_TypeDef  RFlock;          //右前中控锁
	const StateStr_TypeDef  LRlock;           //左后中控锁
	const StateStr_TypeDef  RRlock;           //右后中控锁
	const StateStr_TypeDef  pump_air;         //气泵
	const StateStr_TypeDef  gear_S;          //档位S ASCII
	const StateStr_TypeDef key_sign;		 			//钥匙状态
	const StateStr_TypeDef  ig_acc;          //ACC状态
	const StateStr_TypeDef  ig_on;           //on状态
	const StateStr_TypeDef  insert_slow;     //慢充枪插枪状态
	const StateStr_TypeDef  insert_fast;     //快充枪插枪状态
	const StateStr_TypeDef  RFSaftBtSt;      //右前安全带状态
	const StateStr_TypeDef  LRSaftBtSt;      //左后安全带状态
	const StateStr_TypeDef  RRSaftBtSt;      //右后安全带状态
	const StateStr_TypeDef  MIDSaftBtSt;     //中座安全带状态
	const StateStr_TypeDef  ABS_ON;          //ABS泵状态
	const StateStr_TypeDef  Electricity;     //电量
	const StateStr_TypeDef  Endurance_mileage;//电量续航里程
	const StateStr_TypeDef  illSt;           //背景灯
	const StateStr_TypeDef  break_light;     //刹车灯
	const StateStr_TypeDef  back_light;      //倒车灯
	const StateStr_TypeDef  day_light;       //日间行车灯
	const StateStr_TypeDef  r_t_s_fill;      //右转补光灯
	const StateStr_TypeDef  l_t_sig_fill;    //左转补光灯
	const StateStr_TypeDef  BackLight;       //仪表背光亮度
	const StateStr_TypeDef  Gaspedal;        //油门踏板开度
	const StateStr_TypeDef  Fangear;         //风扇档位
}saveTab_TypeDef;
//读取数据用PID
typedef struct OBDIIPID
{
	u8 mode;
	u8 pid;
	u32 OBDData;
}OBDIIPID;

typedef struct __attribute__((packed)) DATAFLOW
{
	u32 id;//记录时哪个ECU数据
	 u8 sid;
	 u8 pid;
	 u8 data[4];
}DATAFLOW;
typedef struct __attribute__((packed)) DTCSAVEDATA
{
	u32 id;
	u8  length;
	u8  data[30];
}DTCSAVEDATA;
/********************以上是从STM32中cpy资源过来***************************/
u8		u8AutoDoorSt(void);   //车门状态bit0:左前门  bit1:右前门 bit2:左后门  bit3:右后门  bit4:后备箱  bit5:前机舱盖
u8		u8AutoLigSt(void);   //
u8		u8AutoDoorSt(void); //bit0:左前 bit1：右前 bit2：左后 bit3：右后 bit4：后备箱 bit5：前机舱盖
u8		u8AutoLigSt(void);  //bit0:远光 bit1: 近光 bit2: 示廓 bit3: 左闪 bit4: 右闪   bit5: 双闪 bit6 前雾灯 bit7 后雾灯
u8		u8AutoLedSt(void);  //bit0:ill bit1:刹车灯 bit2:倒车灯bit3:日间行车灯bit4:右转补光灯 bit5 左转补光灯
u8		u8BackLight(void);  //%输出仪表背光亮度
u8		u8AutoWinSt(void);  //bit0-4 左前 右前 左后 右后 天窗
u8		u8AutoLockSt(void); //bit0:中控锁 bit1:断电 bit2：PKE设防bit3:左前门锁 bit4:右前门锁 bit5:左后门锁 bit6:右后门锁 
u8		u8AutoGearSt(void); //bit0:手刹 bit1:脚刹 bit2:P bit3:R bit4:N bit5:D bit6:气泵 bit7:S档
u8		u8AutoIgSt(void);   //bit0:上电信号 bit1:发动机信号 bit2:钥匙信号 bit3：ACC bi4：ON
u8		u8ChargeSt(void);   //bit0:慢充  bit1:快充  bit2:慢充插枪 bit3:快充插枪
u8		u8SaftBtSt(void);   //bit0:AC空调状态 bit1:左前安全带 bit2:右前安全带 bit3:左后安全带  bit4:右后安全带 bit5：中座安全带 bit6 ABS激活
u32		u32AutoOdo(void);   //Km32位的里程
u16		u16AutoFuel(void);  //L16位油量
u16		u16AutoSOC(void);   //%16位电量
u16		u16SocForMile(void);//km16位续航
u16		u16AutoSpeed(void); //km/h16位车速
u16		u16AutoEngRd(void); //RPM16位发动机转速
u8		u8AutoRemindRD(void); //bit0:发动机提醒 bit1:手刹未放下 bit2:安全带未系   bit3:胎压故障
//u32		u32AutoBATVol(void);   //V电池电压
u32		u32AutoVol(void);      //V车辆电压
u32		u32AvgOilCsp(void);    //bit31-24 单位  bit23-bit0 平均油耗/瞬时油耗
u32		u32AtmoPress(void);    //Pa大气压力
u32		u32CoolTemp(void);     //℃冷却液温度
u8		u8ThroPos(void);       //%节气门位置
u16		u16WheelDeg(void);     //方向盘转角
u32		u32TripMile(void);     //km小计里程	
u16		u16TripSpeed(void);    //km/h小计里程车速
u32		u32TripAvgOilCsp(void);//L/100Km小计里程平均油耗
u32		u32TripTime(void);     //min小计里程时间
u32		u32StartupMile(void);     //km自启动里程
u16		u16StartupSpeed(void);    //km/h自启动后车速
u32		u32StartupAvgOilCsp(void);//L/100Km自启动后平均油耗
u32		u32StartupTime(void);     //min自启动后时间
u8		u8GetDTCCount(void);      //获取故障码个数
u32*	u32GetDTCarray(void);     //获取故障码数组
u8*		u8GetVINCarry(void);      //获取车架号vin
u8*	  u8GetFuncAble(void);      //使能位数组
u32		u32static_v(void);       //静态电压
u32		u32launch_v(void);       //启动电压
u32		u32thr_s_v(void);        //节气门信号电压
u32		u32pedal_s_v(void);      //油门踏板位置传感器电压
u32		u32inject_p_w(void);     //喷油脉宽
u32		u32inject_p_q(void);       //喷油量
u32		u32inject_p_t(void);       //喷油时间
u32		u32oil_s_p(void);        //供油压力
u32		u32air_in_p(void);       //进气压力
u32		u32air_in_t(void);       //进气温度
u32		u32water_t(void);        //水温
u32		u32f_o_v(void);          //前氧传感器电压
u32		u32b_o_v(void);          //后氧传感器电压
u32     u32TPMSVal(void);        //获取胎压值
OBDIIPID* getOBDIIPID(can_receive_message_struct canRxMsg);//获取PID以及原始数据
u32 getPIDList(u8 * pReData);

//新增用于实时查询
extern u8 checkPIDSta;	//0初始值；1需要实时查询1次；2查询完成
extern u8 checkErrListSta;	//0初始值；1需要实时查询1次；2查询完成
extern u8 checkMendSta;	//0初始值；1需要实时查询1次；2查询完成
extern u8 checkAESta;   //AE 数据上报，0初始值；1需要实时查询1次；2查询完成
extern u8 checkAFSta;   //AF  数据上报，0初始值；1需要实时查询1次；2查询完成

#define SetCheckPIDSta(da) 			checkPIDSta = da		//用于设置实时查询开始1、查询完成2、设置为初始值0
#define GetCheckPIDSta() 				checkPIDSta					//应用层实时查询进度
#define SetCheckErrListSta(da) 	checkErrListSta = da	//用于设置实时查询开始1、查询完成2、设置为初始值0
#define GetCheckErrListSta() 		checkErrListSta			//应用层实时查询进度
#define SetCheckMendSta(da) 		checkMendSta = da		//用于设置实时查询开始1、查询完成2、设置为初始值0
#define GetCheckMendSta() 			checkMendSta				//应用层实时查询进度
#define SetCheckAESta(da) 			checkAESta = da		//用于设置实时查询开始1、查询完成2、设置为初始值0
#define GetCheckAESta() 				checkAESta					//应用层实时查询进度
#define SetCheckAFSta(da) 			checkAFSta = da		//用于设置实时查询开始1、查询完成2、设置为初始值0
#define GetCheckAFSta() 				checkAFSta					//应用层实时查询进度


#endif
